RecyclerView 缓存机制

RecyclerView 缓存机制

RecyclerView 的缓存机制为 4 级缓存,缓存的内容为 ViewHolder,而不是 View 本身. Recycler 类为缓存相关的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public final class Recycler {
final ArrayList<RecyclerView.ViewHolder> mAttachedScrap = new ArrayList();
ArrayList<RecyclerView.ViewHolder> mChangedScrap = null;
final ArrayList<RecyclerView.ViewHolder> mCachedViews = new ArrayList();
private final List<RecyclerView.ViewHolder> mUnmodifiableAttachedScrap;
private int mRequestedCacheMax;
int mViewCacheMax;
RecyclerView.RecycledViewPool mRecyclerPool;
private RecyclerView.ViewCacheExtension mViewCacheExtension;
static final int DEFAULT_CACHE_SIZE = 2;
public Recycler() {
this.mUnmodifiableAttachedScrap = Collections.unmodifiableList(this.mAttachedScrap);// 5643 5644
this.mRequestedCacheMax = 2;// 5646
this.mViewCacheMax = 2;// 5647
}
}

缓存可分为:

一级缓存 Scrap

屏幕内的缓存。包含 mAttachedScrap 和 mChangedScrap。它们是 RecyclerView 内部控制的缓存,本例暂时忽略

二级缓存 Cache

mCachedViews:缓存ViewHolder,类型为 ArrayList。刚刚滑出屏幕 ViewHolder 的缓存。默认容量为 2

三级缓存 ViewCacheExtension

自定义的缓存,很少会用到,暂时忽略

四级缓存 RecycledViewPool

ViewHolder 缓存池。当二级缓存容量超过 2 时,按照先进先出的原则,Cache 中的 ViewHolder 会保存到 RecycledViewPool 中。

整体流程如下:

Recycler首先去二级缓存(Cache)里面查找是否命中,如果命中直接返回。如果二级缓存没有找到,则去四级缓存查找,如果四级缓存找到了则调用 Adapter.bindViewHolder 来绑定内容,然后返回。如果四级缓存没有找到,那么就通过 Adapter.createViewHolder 创建一个 ViewHolder,然后调用 Adapter.bindViewHolder 绑定其内容,然后返回为 Recycler。

流程图可参考(来源网络,侵删):

来源网络,侵删

参考文章:

https://juejin.cn/post/6844903661726859271